package alg;

import java.util.Arrays;
import java.util.List;

import model.Batoh;
import alg.BatohAlg;

public class HrubaSila implements BatohAlg {

	 List<Batoh> zoznamInstancii;

	    public HrubaSila(List<Batoh> zoznamInstancii) {
	       this.zoznamInstancii = zoznamInstancii;
	    }

	    String vyriesProblemAvypisRiesenie(Batoh b) { //prechadza vsetky ohodnotenia konfiguracnych premennych

	        int citac = 0;
	        int dosavadnaMaxCena = 0;
	        String citacBinarny;
	        int[] poleKonfiguracie=  new int[b.pocetVeciVbatohu];
	        int[] konfiguraciaSmaxHodnotou = new int[b.pocetVeciVbatohu];

	        int[] tempPole = new int[b.pocetVeciVbatohu];

	        for (int kombinaciaVeci = 0; kombinaciaVeci < Math.pow(2, b.pocetVeciVbatohu); kombinaciaVeci++, citac++) { // pre 4 veci 16* prebehne cytklus

	            citacBinarny = Integer.toBinaryString(citac);

	            Arrays.fill(poleKonfiguracie, 0);
	            int pocitadlo = 0;
	            for (int i = b.pocetVeciVbatohu - citacBinarny.length(); i < b.pocetVeciVbatohu; i++, pocitadlo++) {
	                tempPole[i] = (Integer.valueOf(citacBinarny.charAt(pocitadlo))) - 48;
	            }//dopn nevyznamove nuly

	            for (int i = 0; i < tempPole.length; i++) {
	                poleKonfiguracie[i] = tempPole[i];// pole konfiguracie je aktualna binarna konfiguracia

	            }//pole konfig obsahuje citac v binare

	            boolean jeLepsieMax = skontrolujPodmienku(poleKonfiguracie, b);

	            if (jeLepsieMax) {
	                int sumaCeny = 0;
	                for (int i = 0; i < poleKonfiguracie.length; i++) {
	                    sumaCeny += poleKonfiguracie[i] * (b.getZoznamVeci().get(i)).getCenaVeci();
	                }


	                if (sumaCeny > dosavadnaMaxCena) {
	                    dosavadnaMaxCena = sumaCeny;
	                    for (int i = 0; i < poleKonfiguracie.length; i++) {
	                        konfiguraciaSmaxHodnotou[i] = poleKonfiguracie[i];
	                    }
	                }
	            }
	        }
	        StringBuilder riesenie = new StringBuilder();
	        riesenie.append(b.getCisloInstancie() + " " + b.getPocetVeciVbatohu() + " " + dosavadnaMaxCena + " ");
	        for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
	            riesenie.append(konfiguraciaSmaxHodnotou[i] + " ");
	        }
	        riesenie.append("\n");
	        System.out.print(riesenie);
	        return riesenie.toString();
	    }

	    public boolean skontrolujPodmienku(int[] konfiguracia, Batoh b) {
	        double sumaHmotnosti = 0;
	        for (int i = 0; i < konfiguracia.length; i++) {
	            sumaHmotnosti += konfiguracia[i] * (b.getZoznamVeci().get(i)).getVahaVeci();
	        }
	        if (sumaHmotnosti <= b.getMaxVaha()) {
	            return true;
	        } 
	        return false;
	    }

	    public String vyriesBatoh() {
	        StringBuilder riesenieTotal = new StringBuilder();
	        for (Batoh aktualnaInstancia: zoznamInstancii)
	        {
	            riesenieTotal.append(vyriesProblemAvypisRiesenie(aktualnaInstancia));
	        }
	        riesenieTotal.append("\n");
	        return riesenieTotal.toString();
	    }
	}


